<?php

/**
 * Classe principal do framework
 * Instancia as classes principais e delega as tarefas
 * 
 * @author Cristiano
 */
 Class Core
 {
 	/**
 	 * Propriedade Singleton do objeto
 	 *
 	 * @var Core
 	 */
 	private static $instancia;

 	/**
 	 * Email do administrador do sistema
 	 * @var unknown_type
 	 */
 	private $email_administrador;

 	/**
 	 * Retorna o email do administrador do sistema
 	 */
 	public function GetAdmistrador(){
 		return $this->email_administrador;
 	}

 	/**
 	 * Configura o velocímetros para medir a performance do sistema
 	 * 
 	 * @param boolean
 	 */
 	public function Medidor($bool){
 		if($bool) Sistema::GetInstancia()->SetMedidor(true);
 	}

 	/**
 	 * Configura o email do administrador do sistema;
 	 * @param unknown_type $email
 	 */
 	public function SetAdministrador($email){
 		$this->email_administrador = $email;
 	}

	/**
	 * Identifica se o sistema está sendo acessado por um bot
	 */  	
 	private $Bot; 

 	/**
 	 * Adiciona um prefixo ao nome das tabelas geradas no sistema
 	 * @var string
 	 */
 	private $prefixo_tabela;
 	
 	/**
 	 * Configura o prefixo das tabelas a serem geradas pelo sistema no banco de dados
 	 * @param $pre
 	 */
 	public function SetPrefixoTabela($pre){
 		$this->prefixo_tabela = $pre;
 	}
 	
 	/**
 	 * Retorna o prefixo de tabelas utilizado pelo sistema
 	 */
 	public function GetPrefixoTabela(){
 		return $this->prefixo_tabela;
 	}

 	/**
 	 * Método Singleton do objeto
 	 *
 	 * @return Core
 	 */
 	public static function GetInstancia(){
 		if(Core::$instancia == null){
 			self::$instancia = new Core();
 		}
 		return Core::$instancia;
 	}

 	/**
 	 * Construtor classe que inicia todo o sistema
 	 * 
 	 * @return 	void
 	 */
 	public function __construct($app = '')
 	{
 		$this->Utils = new Utils;
		//----------------- Configurações iniciais
 		$this->Inicio = date('d/m/Y H:i:s');

		//----------------- Configuração do html;
		header("X-Powered-By: SofiaPHP");
		header('p3p: CP="CAO PSA OUR"'); 

		//-----------------	Definições básicas do sistema
		define ("windows", preg_match("/^[a-zA-Z]:/", __FILE__));
		define ("ajax", isset($_SERVER["HTTP_X_REQUESTED_WITH"]));
		define ("post", $_SERVER["REQUEST_METHOD"] == "POST");
		//define ("mobile", is_mobile());
		//$this->Bot = $this->e_bot();
		//$this->RegistraIndex();
 	}

 	/**
 	 * Controla a exibição de erros do sistema.
 	 * @param boolean $bool
 	 */
 	public function ExibeErros($bool){
 		if($bool){
 			ini_set('display_errors', 1);
 		}else{
 			ini_set('display_errors', 0);
 		}
 		
 	}
	
	/**
	 * Função que inicializa o controle indicado e chama o método apropriado,
	 * O método pode ser recebido via parametro action e caso não seja recebido nenhum então o método MontaTela é chamado 
	 */
 	public function Start(){
 		$this->RegistraIndex();

 		$roteador = Roteador::GetInstancia();
		$roteador->Analisar();

		$sistema = Sistema::GetInstancia();

		if($sistema->ValidaPagina()){
			$control = ControleFactory::CriaControle();
			if(!$control) die("Controlador não encontrado");

			$control = $this->ConfiguraControle($control);
			$render = SofiaUi::GetInstancia();
			$render->Renderizar($control);
		}else{
			echo $sistema->GetControleBase() . '<br />';
			echo 'Página não encontrada.';
		}
	}

	/**
	 * Aqui é feito as primeiras ações do controlador, tais como a execução do método Init() para configuração de bando de dados e datagrid
	 * e também é feito o carregamento dos plugins usados pelo controlador assim como a configuração de um Modelo caso o controlador utilize algum.
	 * 
	 * Depois são chamadas as funções padrões para execução do sistema
	 * 
	 * @return Controle
	 */
	public function ConfiguraControle(Controle $control){
		if(Sistema::GetInstancia()->GetMedidor()) Velocimetro::GetInstancia()->Start("Core::ConfiguraControle");

		$control->Init();
		$control->ConfiguraModelo();
		$control = Loader::CarregaPlugins($control);
		$sistema = Sistema::GetInstancia();

		$action = $sistema->GetParametros('action');
		if($action){
			$metodos = get_class_methods($control);
			$action = ucfirst($action);

			if(in_array($action, $metodos)){
				$control->$action();
			}else{
				die("Ação não permitida");
			}
		}

		$control->MostraTela();
		$control->Finaliza();

		if(Sistema::GetInstancia()->GetMedidor()) Velocimetro::GetInstancia()->End("Core::ConfiguraControle");

		return $control;
	}

 	/**
	 * Verfica se é requerimento de algum mecanismo de busca
 	 * Esta função ainda não esta totalmente implementada.	
	 * 
	 * @ignore	Função ainda não pronta para utilização
	 * @return	boolean
	 * @access 	private
	 */
	private function e_bot(){
		if(Sistema::GetInstancia()->GetMedidor()) Velocimetro::GetInstancia()->Start("Core::e_bot");
		
		$ua = isset($_SERVER['HTTP_USER_AGENT']) ? strtolower($_SERVER['HTTP_USER_AGENT']) : '';
		$ip = $_SERVER['REMOTE_ADDR'];

		if(Sistema::GetInstancia()->GetMedidor()) Velocimetro::GetInstancia()->End("Core::e_bot");
		return $ip == 'local' 	|| strpos($ua, 'googlebot') !== false		|| strpos($ua, 'mediapartners') !== false 
								|| strpos($ua, 'yahooysmcm') !== false		|| strpos($ua, 'baiduspider') !== false
								|| strpos($ua, 'msnbot') !== false			|| strpos($ua, 'slurp') !== false
								|| strpos($ua, 'ask') !== false				|| strpos($ua, 'teoma') !== false
								|| strpos($ua, 'spider') !== false 			|| strpos($ua, 'heritrix') !== false 
								|| strpos($ua, 'attentio') !== false 		|| strpos($ua, 'twiceler') !== false 
								|| strpos($ua, 'irlbot') !== false 			|| strpos($ua, 'fast crawler') !== false     
								|| strpos($ua, 'fastmobilecrawl') !== false || strpos($ua, 'jumpbot') !== false
								|| strpos($ua, 'yahooseeker') !== false		|| strpos($ua, 'googlebot-mobile') !== false
								|| strpos($ua, 'motionbot') !== false		|| strpos($ua, 'mediobot') !== false
								|| strpos($ua, 'chtml generic') !== false;

	}

	/**
	 * Avisa ao administrador por email quando algum bot indexar a página
	 */
	private function RegistraIndex(){
		if(Sistema::GetInstancia()->GetMedidor()) Velocimetro::GetInstancia()->Start("Core::RegistraIndex");
		
		if($this->e_bot() != 'local'){
			if(@eregi($this->e_bot(), $_SERVER['HTTP_USER_AGENT'])){
				@mail($this->AdminEmail(), 'Foi detectado acesso de bot no site: ' . $_SERVER['SERVER_NAME'], $this->Inicio . ' - ' . $this->e_bot() . 'pagina; ' . $_SERVER['SERVER_NAME'] . ROOT_VIRTUAL);
			}
		}

		if(Sistema::GetInstancia()->GetMedidor()) Velocimetro::GetInstancia()->End("Core::RegistraIndex");
	}

	/**
	 * Cria tabelas no banco de dados utilizando as classes Modelos listadas no array
	 *
	 * @param array $modelos
	 * @return void
	 */
	public function CriarTabelas($modelos){
		$dao = Dao::GetInstancia();
		$dao->Conectar();
		$dao->criar_tabela($modelos);
		
		echo "Tabelas Cadastradas:<br />";
		foreach($modelos as $m){
			echo "- $m; <br />";
		}
		echo "Favor comentar o algorítmo de inserção de tabelas no arquivo index.php.";
		die();
	}
 }